{
  buildDhallPackage,
  fetchFromGitHub,
  lib,
}:

# This function is used by `dhall-to-nixpkgs` when given a GitHub repository
lib.makePackageOverridable (
  {
    # Arguments passed through to `buildDhallPackage`
    name,
    dependencies ? [ ],
    source ? false,

    # The directory containing the Dhall files, if other than the root of the
    # repository
    directory ? "",
    # The file to import, relative to the above directory
    file ? "package.dhall",
    # Set to `true` to generate documentation for the package
    document ? false,

    # Arguments passed through to `fetchFromGitHub`
    owner,
    repo,
    rev,
    # Extra arguments passed through to `fetchFromGitHub`, such as the hash
    # or `fetchSubmodules`
    ...
  }@args:

  let
    versionedName = "${name}-${rev}";

    src = fetchFromGitHub (
      {
        name = "${versionedName}-source";

        inherit owner repo rev;
      }
      // removeAttrs args [
        "name"
        "dependencies"
        "document"
        "source"
        "directory"
        "file"
        "owner"
        "repo"
        "rev"
      ]
    );

    prefix = lib.optionalString (directory != "") "/${directory}";

  in
  buildDhallPackage (
    {
      inherit dependencies source;

      name = versionedName;

      code = "${src}${prefix}/${file}";
    }
    // lib.optionalAttrs document {
      documentationRoot = "${src}/${prefix}";

      baseImportUrl = "https://raw.githubusercontent.com/${owner}/${repo}/${rev}${prefix}";
    }
  )
)
